const fse = require('fs-extra');
const path = require('path');

const UPLOAD_DIR = path.resolve(__dirname, '.', 'target');

module.exports = async (res, fileName, filePath, perSize) => {
  // fileName 是chunk包的前缀名称，也是包所在的文件夹的名称
  // filePath 是最终生成的文件名称，包含绝对路径
  // console.log(fileName, filePath);

  // 思路 将对应切片的文件夹遍历找出来，然后使用nodejs的stream流 进行合并
  const chunkDir = path.resolve(UPLOAD_DIR, '.', fileName);
  // 所有切片的数组集合，因为合并要按照顺序合并，所以需要给数组里面切片 从小到大排序
  const chunkPaths = await fse.readdir(chunkDir);
  chunkPaths.sort((a, b) => a.split('-')[1] - b.split('-')[1]);
  // console.log(chunkPaths, perSize);

  // 关键点，开始位置和结束位置，每一个chunk都可以创建一个可写流
  await Promise.all(
    chunkPaths.map((chunkPath, index) => {
      // 获取每个chunk的绝对路径
      const chunkPathAbsolute = path.resolve(chunkDir, chunkPath);
      // console.log(chunkPathAbsolute);
      // 和前端拆分文件类似，创建后端的多个chunk可写流, 相当于占位子
      const chunkWriteStream = fse.createWriteStream(filePath, {
        start: index * perSize,
        end: (index + 1) * perSize,
      });

      return new Promise((resolve, reject) => {
        // 将每个chunk包的地址，生成一个可读流， 使用chunk的绝对路径
        const chunkReadStream = fse.createReadStream(chunkPathAbsolute);
        // 在中间需要加上 什么时候合并结束的标志
        chunkReadStream.on('end', () => {
          resolve();
        });
        chunkReadStream.pipe(chunkWriteStream);
      });
    })
  );

  // 合并完之后删除 切片临时目录
  fse.rm(chunkDir, { recursive: true, force: true });

  res.end('/merge ok');
};
